package pe.com.bbva.modpre.persistencia.hibernate;

import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.LimiteDelegacion;
import pe.com.bbva.modpre.dominio.Operacion;
import pe.com.bbva.modpre.persistencia.LimiteDelegacionDAO;
import pe.com.bbva.modpre.utileria.Busqueda;

@Repository
@SuppressWarnings("serial")
public class LimiteDelegacionHibernate extends BaseHibernate<LimiteDelegacion, Long> 
	implements LimiteDelegacionDAO{

	@Autowired
	public LimiteDelegacionHibernate(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	@Override
	public List<LimiteDelegacion> buscarLimitesDelegacion(LimiteDelegacion limiteDelegacion) {
		Busqueda filtro = Busqueda.forClass(LimiteDelegacion.class);
		if (limiteDelegacion != null) {
			if (limiteDelegacion.getUsuario() != null && limiteDelegacion.getUsuario().getNombres() != null) {
				filtro.createAlias("usuario", "u");
				filtro.add(Restrictions.ilike("u.nombres", limiteDelegacion.getUsuario().getNombres(), MatchMode.ANYWHERE));
			}
			if (limiteDelegacion.getProducto() != null && limiteDelegacion.getProducto().getNombre() != null) {
				filtro.createAlias("producto", "p");
				filtro.add(Restrictions.ilike("p.nombre", limiteDelegacion.getProducto().getNombre(), MatchMode.ANYWHERE));
			}
			if (limiteDelegacion.getMoneda() != null && limiteDelegacion.getMoneda().getNombre() != null) {
				filtro.createAlias("moneda", "m");
				filtro.add(Restrictions.ilike("m.nombre", limiteDelegacion.getMoneda().getNombre(), MatchMode.ANYWHERE));
			}
			if (limiteDelegacion.getMontoMin() != null) {
				filtro.add(Restrictions.eq("montoMin", limiteDelegacion.getMontoMin()));
			}
			if (limiteDelegacion.getMontoMax() != null) {
				filtro.add(Restrictions.eq("montoMax", limiteDelegacion.getMontoMax()));
			}
			if (limiteDelegacion.getPorcentaje() != null) {
				filtro.add(Restrictions.eq("porcentaje", limiteDelegacion.getPorcentaje()));
			}
			if (limiteDelegacion.getSegmento() != null && limiteDelegacion.getSegmento().getNombre() != null) {
				filtro.createAlias("segmento", "s");
				filtro.add(Restrictions.ilike("s.nombre", limiteDelegacion.getSegmento().getNombre(), MatchMode.ANYWHERE));
			}
			if (limiteDelegacion.getSpread() != null) {
				filtro.add(Restrictions.eq("spread", limiteDelegacion.getSpread()));
			}

		}
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
	}

	@Override
	public List<LimiteDelegacion> buscarLimiteDelegacionxOperacion(Operacion operacion) {
		Busqueda filtro = Busqueda.forClass(LimiteDelegacion.class);
		if (operacion != null) {
			if (operacion.getProducto() != null) {
				filtro.createAlias("producto", "p", CriteriaSpecification.LEFT_JOIN);
				filtro.add(Restrictions.or(Restrictions.eq("p.id", operacion.getProducto().getId()), 
						Restrictions.isNull("p.id")));
			}
			if (operacion.getSolicitud().getSegmento() != null) {
				filtro.createAlias("segmento", "s", CriteriaSpecification.LEFT_JOIN);
				filtro.add(Restrictions.or(Restrictions.eq("s.id", operacion.getSolicitud().getSegmento().getId()), 
						Restrictions.isNull("s.id")));
			}
			if (operacion.getMoneda() != null) {
				filtro.createAlias("moneda", "m", CriteriaSpecification.LEFT_JOIN);
				filtro.add(Restrictions.or(Restrictions.eq("m.id", operacion.getMoneda().getId()), 
						Restrictions.isNull("m.id")));
			}
			if (operacion.getMontoCredito() != null) {
				filtro.add(Restrictions.or(Restrictions.and(Restrictions.ge("montoMax", operacion.getMontoCredito()), 
						Restrictions.le("montoMin", operacion.getMontoCredito())), 
						Restrictions.and(Restrictions.isNull("montoMax"), 
								Restrictions.isNull("montoMin"))));
			}

		}
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
	}
	
	
	
}
